← Back to Frontend System Design Blogs

Order Module – Low Level Design

2025-06-27📖 4 min read

Share:

📦 Step 8: Order Module – Low Level Design (LLD)

This document covers the low-level design of the order feature module responsible for order history, details, and tracking in the Angular e-commerce frontend.


📦 Module Structure

src/
├── app/
│   └── features/
│       └── order/
│           ├── components/
│           │   ├── order-list/
│           │   ├── order-details/
│           │   └── order-tracking/
│           ├── services/
│           │   └── order.service.ts
│           ├── store/
│           │   ├── order.actions.ts
│           │   ├── order.reducer.ts
│           │   ├── order.effects.ts
│           │   └── order.selectors.ts
│           ├── models/
│           │   └── order.model.ts
│           ├── order-routing.module.ts
│           └── order.module.ts

🧱 Component Breakdown

📋 OrderListComponent

  • Displays paginated list of user orders
  • Shows order summary: order ID, date, status, total
  • Click to view order details

📄 OrderDetailsComponent

  • Detailed view of a selected order
  • Lists products, quantities, prices, shipping info
  • Shows payment status and delivery tracking link

🚚 OrderTrackingComponent

  • Displays current shipping status and estimated delivery date
  • Integrates with third-party tracking APIs

🧪 Service: OrderService

Handles API calls related to orders and tracking.

@Injectable({ providedIn: "root" })
export class OrderService {
  private orderUrl = "/api/orders";

  constructor(private http: HttpClient) {}

  getOrders(
    userId: string,
    page: number = 1,
    limit: number = 10
  ): Observable<OrderPage> {
    return this.http.get<OrderPage>(
      `${this.orderUrl}?userId=${userId}&page=${page}&limit=${limit}`
    );
  }

  getOrderById(orderId: string): Observable<Order> {
    return this.http.get<Order>(`${this.orderUrl}/${orderId}`);
  }

  getTrackingStatus(orderId: string): Observable<TrackingStatus> {
    return this.http.get<TrackingStatus>(
      `${this.orderUrl}/${orderId}/tracking`
    );
  }
}

🧩 NgRx Store (optional)

✅ Actions – order.actions.ts

export const loadOrders = createAction(
  "[Order] Load Orders",
  props<{ userId: string; page?: number }>()
);
export const loadOrdersSuccess = createAction(
  "[Order] Load Orders Success",
  props<{ ordersPage: OrderPage }>()
);
export const loadOrderDetails = createAction(
  "[Order] Load Order Details",
  props<{ orderId: string }>()
);
export const loadOrderDetailsSuccess = createAction(
  "[Order] Load Order Details Success",
  props<{ order: Order }>()
);
export const loadTrackingStatus = createAction(
  "[Order] Load Tracking Status",
  props<{ orderId: string }>()
);
export const loadTrackingStatusSuccess = createAction(
  "[Order] Load Tracking Status Success",
  props<{ status: TrackingStatus }>()
);

🔁 Reducer – order.reducer.ts

Handles order lists, details, and tracking status updates.

🌐 Effects – order.effects.ts

Triggers async API calls for loading orders, details, and tracking info.

🔍 Selectors – order.selectors.ts

export const selectOrdersPage = createSelector(
  selectOrderState,
  (state) => state.ordersPage
);
export const selectOrderDetails = createSelector(
  selectOrderState,
  (state) => state.selectedOrder
);
export const selectTrackingStatus = createSelector(
  selectOrderState,
  (state) => state.trackingStatus
);

🔄 API Contracts

Endpoint Method Request Body Response
/orders?userId&page&limit GET OrderPage
/orders/:id GET Order
/orders/:id/tracking GET TrackingStatus

📐 Models

export interface OrderItem {
  productId: string;
  name: string;
  price: number;
  quantity: number;
  imageUrl: string;
}

export interface Order {
  id: string;
  userId: string;
  items: OrderItem[];
  total: number;
  status: string;
  orderDate: string;
  shippingAddress: Address;
  paymentStatus: string;
}

export interface OrderPage {
  orders: Order[];
  currentPage: number;
  totalPages: number;
  totalOrders: number;
}

export interface TrackingStatus {
  orderId: string;
  currentStatus: string;
  estimatedDelivery: string;
  history: { date: string; status: string }[];
}

export interface Address {
  fullName: string;
  street: string;
  city: string;
  state: string;
  zip: string;
  country: string;
  phone: string;
}

🚦 Routing & Guards

const routes: Routes = [
  { path: "list", component: OrderListComponent, canActivate: [AuthGuard] },
  {
    path: "details/:id",
    component: OrderDetailsComponent,
    canActivate: [AuthGuard],
  },
  {
    path: "tracking/:id",
    component: OrderTrackingComponent,
    canActivate: [AuthGuard],
  },
];

🔐 Security & UX

  • Protect all routes with AuthGuard
  • Paginate order list for performance
  • Show loading spinner during API calls
  • Display clear error messages on failure
  • Provide user-friendly tracking updates

✅ Responsibilities Summary

Part Responsibility
OrderListComponent List user orders with pagination
OrderDetailsComponent Show detailed order info
OrderTrackingComponent Display shipping and delivery status
OrderService API interaction for orders and tracking
Store (NgRx) Manage order data and state